DNS服务器(二):使用bind实现主从DNS服务器数据同步

一、bind简介

        Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(www.isc.org)维护。在yum仓库中可以找到软件,配置好yum源,直接使用命令yum install bind就可以安装。当前bind的稳定版本为bind9,bind的服务名称为named,监听的端口为53号端口。bind的主要配置文件为/etc/named.conf,此文件主要用于配置区域,并指定区域数据库文件名称。区域数据库文件通常保存于/var/named/目录下,用于定义区域的资源类型。

二、使用bind架设DNS服务器

        实例操作:以域名wubinary.com为例配置一个DNS服务器,实现正向解析与反向解析。

1.使用setup命令配置DNS服务器的IP地址,我们以192.168.0.70这个IP地址为例,在本地架设一个DNS服务器。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/01.jpeg?raw=true)

2.bind配置文件为/etc/named.conf,此文件用于定义区域。每个区域的数据文件保存在/var/named目录下。

        named.conf各参数项说明:

1
2
3
4
5
6
7
8
9
options {
//全局选项
}
zone "ZONE name"{
//定义区域
}
logging{
//定义日志系统
}

        named.conf文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
options {
listen-on port 53 { 127.0.0.1; }; #定义监听端口及IP地址
listen-on-v6 port 53 { ::1; }; #定义监听的IPv6地址
directory "/var/named"; #全局目录
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost; };#允许查询的IP地址
recursion yes; #是否允许递归查询
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

        注意:bind的配置文件/etc/named.conf里必须要定义的三个区域是:根、127.0.0.1和127.0.0.1的反解。

        以上options选项中有许多是我们用不到,我们先把它们注释掉。结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
options {
// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
// allow-query { localhost; };
// recursion yes;
// dnssec-enable yes;
// dnssec-validation yes;
// dnssec-lookaside auto;
/* Path to ISC DLV key */
// bindkeys-file "/etc/named.iscdlv.key";
// managed-keys-directory "/var/named/dynamic";
};

3.打开/etc/named.rfc1912.zones文件,添加一个区域。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/02.jpeg?raw=true)

  • type: 用于定义区域类型,此时只有一个DNS服务器,所以为master,type可选值为:hint(根的)|master(主的)|slave(辅助的)|forward(转发)
  • file:用于定义区域数据文件路径,默认该文件保存在/var/named/目录。

        区域添加好后,使用命令:named-checkconf 或 service named configtest测试配置文件语法格式。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/03.jpeg?raw=true)

        出错了!原来少了一个分号,配置文件的格式是每行后面都必须加分号结束,并且有花括号的地方,花括号两边必须要有空格。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/04.jpeg?raw=true)

        没有提示则表示文件语法正常。

4.新建数据库文件/var/named/wubinary.com.zone,并添加资源记录。

资源记录的格式:
name [ttl] IN RRtype Value
资源记录名 有效时间 IN 类型 资源记录的值

SOA: 只能有一个,而且必须是第一个
name: 只能是区域名称,通常可以简写为@
value: 主DNS服务器的FQDN

NS: 可以有多条
name: 区域名称,通常可以简写为@
value: DNS服务器的FQDN(可以使用相对名称)

A: 只能定义在正向区域文件中
name: FQDN(可以使用相对名称)
value: IP

MX: 可以有多个
name: 区域名称,用于标识smtp服务器
value: 包含优先级和FQDN
优先级:0-99,数字越小,级别越高;

CNAME:
name: FQDN
value: FQDN

PTR: IP –> FQDN, 只能定义在反向区域数据文件中,反向区域名称为逆向网络地址加.in-addr.arpa.后缀组成
name: IP, 逆向的主机地址,主机地址反过来写加上.in-addr.arpa.
value: FQDN

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/05.jpeg?raw=true)

        $TTL为定义的宏,表示下面资源记录ttl的值都为600秒。

        @符号可代表区域文件/etc/named.conf里面定义的区域名称,即:”wubinary.com.”。

        每个区域的资源记录第一条必须是SOA,SOA后面接DNS服务器的域名和电子邮箱地址,此处电子邮箱地址里的@因为有特殊用途,所以此处要用点号代替。SOA后面小括号里的各值所代表的意义如下所示:

@ IN SOA dns.wubinary.com dnsadmin.wubinary.com (
2014031201 ;标识序列号,十进制数字,不能超过10位,通常使用日期
2H ;刷新时间,即每隔多久到主服务器检查一次,此处为2小时
4M ;重试时间,应该小于刷新时间,此处为4分钟
1D ;过期时间,此处为1天
2D ;主服务器挂后,从服务器至多工作的时间,此处为2天)

        区域数据文件配置好后,可以使用命令named-checkzone检查语法错误。

        命令格式:

1
named-checkzone "zone_name" zone_file_name

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/06.jpeg?raw=true)

5.两个文件都配置好后,记得查看一下文件的所属组。因为bind程序的服务名称为named,bind默认是使用named组的身份操作文件,所以我们新建的文件所属组都要改为named,并且为了安全起见不能让别人有修改的权限,权限最好改为640。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/07.jpeg?raw=true)

6.设置妥当当后我们就可以开启服务了。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/08.jpeg?raw=true)

7.使用dig命令测试DNS。

        命令格式:

1
dig [-t type] [-x addr] [name] [@server]
  • -t: 指定资源类型,用于正解
  • -x: 指定IP地址,用于反解

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/09.jpeg?raw=true)

        测试成功!

8.以上配置的是DNS服务器的正向解析,接着再配置一下反向解析。编辑配置文件/etc/named.rfc1912.zones,添加一个反解区域。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/10.jpeg?raw=true)

        因为反向解是和正向解析相反的,所以配置文件192.168.0.70.zone直接可以复制wubinary.com.zone修改。反向解析数据文件里面只有SOA、NS、PTR资源记录,所有A记录都要改为PTR记录,名称为IP地址,IP地址可以写全也可以简写,如果写全则是IP地址反写加上.in-addr.arpa.例如:70.0.168.192.in-addr.arpa. PTR资源记录的值为域名。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/11.jpeg?raw=true)

9.检查配置文件语法。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/12.jpeg?raw=true)

        修改权限

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/13.jpeg?raw=true)

10.重新载入配置文件,并测试反向解析。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/14.jpeg?raw=true)

        使用dig -x 测试反向解析。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/15.jpeg?raw=true)

        反向解析配置成功!

        注意:通常在应用中,DNS的反向解析并不是很重要,可以不配置,当服务器中有域名作为邮件服务器时,此时可以配置反向解析,因为邮件中过滤垃圾邮件的技术通常是解析邮箱地址,如果IP地址不能反解成一个域名则视为垃圾邮件。

三、使用bind架设辅助DNS服务器,实现主从数据同步

        DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就会宕机罢工,其次如果这台服务器出现了硬件故障那么服务器管理的区域的域名将无法访问。为了解决这些问题,最好的办法就是使用多个DNS服务器同时工作,并实现数据的同步,这样两台服务器就都可以实现域名解析操作。

        主DNS服务器架设好后,辅助的DNS服务器的架设就相对简单多了。架设主从DNS服务器有两个前提条件,一是两台主机可以不一定处在同一网段,但是两台主机之间必须要实现网络通信;二,辅助DNS服务器必须要有主DNS服务器的授权,才可以正常操作。此时,我们以IP地址192.168.0.80作为我们辅助的DNS服务器的IP地址;

1.设置IP地址;

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/16.jpeg?raw=true)

2.打开辅助DNS服务器的/etc/named.rfc1912.zones文件,添加两个区域记录,这两个记录是主DNS服务器配置文件里已经存在的记录,一个是正向解析记录,一个是反向解析记录。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/17.jpeg?raw=true)

        type: slave,表示此时DNS服务器为辅助DNS服务器,于是下面一行就要定义主DNS服务器的IP地址,辅助DNS服务器才知道去哪里同步数据。辅助DNS服务器的资源类型数据文件通常保存在slaves目录,只需定义一个名称,文件内容通常是自动生成。

        配置好后,直接开启DNS服务,然后再回到主DNS服务器上。

3.修改主DNS服务器的数据文件,添加一条辅助DNS服务器记录,给辅助DNS服务器授权。

        修改正向解析文件/var/named/wubinary.com.zone。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/18.jpeg?raw=true)

        添加了一条NS记录,值为,ns2.wubinary.com.,对应的A记录也要增加一条,把IP地址指向对应的辅助DNS服务器的IP地址。修改完成后,记得要把序列号的值加1,用于通知辅助DNS服务器自动更新数据文件。

        修改反向解析文件/var/named/192.168.0.70.zone。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/19.jpeg?raw=true)

        同样的也增加了两条记录,一条辅助DNS服务器的NS记录和对应的PTR记录。修改完成后记得所序列号的值加1,用于通知辅助DNS服务器自动更新数据文件。

4.重新加载主DNS服务器的配置文件,这时再到回辅助DNS服务器,在/var/named/slaves/目录下会多了两个文件。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/20.jpeg?raw=true )

        查看文件内容,可以看到该文件和主DNS服务器上的文件内容是一样的。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/21.jpeg?raw=true)

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/22.jpeg?raw=true)

5.测试辅助DNS服务器。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/23.jpeg?raw=true)

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/24.jpeg?raw=true)

        在辅助DNS服务器上正向解析和反向解析都能测试成功!

四、主从同步数据的安全性

        DNS服务器的数据同步默认是没有限定主机的,也就是说,网络上只要有一台DNS服务器向你的DNS服务器请求数据,都能实现数据同步,那么这样就相当的不安全了。我们可以使用一个选项allow-transfer,指定可以同步数据的主机IP。主DNS服务器的数据可以给别的服务器同步,相对的,辅助DNS服务器的数据也是可以给其它辅助DNS服务器同步,于是,所有的主从DNS服务器都要设置该参数。

1.指定可以从主DNS服务器上同步数据的主机。

        修改/etc/named.rfc1912.zones文件:

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/25.jpeg?raw=true)

        在每块区域上添加参数allow-transfer,花括号内填写可以同步的主机IP,一般填写辅助DNS服务器的IP地址。可以使用dig命令测试,区域同步:

1
dig -t axfr ZONE_NAME @DNS_SERVCER_IP

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/26.jpeg?raw=true)

        指定IP可以同步数据。

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/27.jpeg?raw=true)

        非指定IP不可以同步数据。

2.指定可以从辅助DNS服务器上同步数据的主机。

        修改/etc/named.rfc1912.zones文件:

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/28.jpeg?raw=true)

        我们只有一台辅助DNS服务器,所以根本不会有主机从这台机器同步数据,所以我们设置成不允许任何人同步。

五、测试DNS解析的其它命令

         测试DNS解析的命令不只是dig可以实现,还有两个命令也可以实现相同的效果。

1.host命令

        host命令格式:

1
# host [-t type] {name} [server]

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/29.jpeg?raw=true)

2.nslookup命令

        这个命令很神奇,在windows的dos里面也可以使用:

1
2
3
4
nslookup>
server DNS_SERVER_IP
set q=TYPE
{name}

%EF%BC%9A%E4%BD%BF%E7%94%A8bind%E5%AE%9E%E7%8E%B0%E4%B8%BB%E4%BB%8EDNS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5/30.jpeg?raw=true)